package fr.alma.domo.model;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.oasisopen.sca.annotation.Destroy;
import org.oasisopen.sca.annotation.Init;

import fr.alma.domo.util.Log;

/**
 * @author E055983B
 *
 */
@SuppressWarnings("serial")
public abstract class AbstractService extends Resource {
	public static final String RESOURCE_FAMILY = "fr.alma.domo.Service";
	
	private static final Map<String,AbstractService> INSTANCES = Collections.synchronizedMap(new HashMap<String,AbstractService>());
	/**
	 * 
	 * @return La liste de toutes les resources
	 */
	public static Map<String,AbstractService> getInstances(){	
		return Collections.unmodifiableMap(INSTANCES);
	}

	@Property(type=String.class)
	protected final static String SERVICE_ID="serviceId";
		
	@Property(type=String.class)
	protected final static String SERVICE_NAME="serviceName";
	
	/**
	 * 
	 * @param serviceId
	 */
	protected AbstractService(String serviceId){
		super(RESOURCE_FAMILY);
		setAttribute(SERVICE_ID, serviceId);
		INSTANCES.put(serviceId,this);
	}
	
	@Override
	protected void finalize() throws Throwable{
		try{
			INSTANCES.remove(getAttribute(SERVICE_ID, String.class));
		}finally{
			super.finalize();
		}
	}
	
	/**
	 * Demarrage du service.
	 * 
	 * Cette méthode est appelée automatique par SCA au moment du 
	 * démarrage du service
	 */
	@Init
	public final void startService(){
		EventHandler.INSTANCE.connect(this);
		onStart();
		Log.i(getClass().getName(), "Starting %s.%s", RESOURCE_FAMILY,getAttribute(SERVICE_ID,String.class));
	}
	
	/**
	 * Arrêt du service.
	 * 
	 * Méthode exécuté automatiquement par SCA lorsque de la destruction du service
	 */
	@Destroy
	public final void stopService(){
		EventHandler.INSTANCE.disconnect(this);
		onStop();
		Log.i(getClass().getName(), "Stopping %s.%s", RESOURCE_FAMILY,getAttribute(SERVICE_ID,String.class));
	}
	
	/**
	 * Les services souhaitant effectuer des routines
	 * de démarrage peuvent surchager cette méthode
	 */
	protected void onStart(){		
	}
	
	/**
	 * Les services souhaitant effectuer des  routines post destruction
	 * peuvent surcharger cette méthode
	 */
	protected void onStop(){		
	}
	
}
